package com.woniu.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

@Component
public class RedisUtil {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private RedisTemplate<String,Object> redisObjectTemplate;

    /*
     * 取出指定分数 范围的 zset数据(从小到大的排序方式)
     * @param key
     * @param min
     * @param max
     * @return
     */
    public Set<String> zrangeByScore(String key, double min, double max) {
        return stringRedisTemplate.opsForZSet().rangeByScore(key, min, max);
    }

    /*
    移除多个sored set 元素
     */
    public void zrem(String key,String... values){
        stringRedisTemplate.opsForZSet().remove(key,values);
    }

    //向redis 存入一个永不过期的字符串
    public  void set(String key,String value){
        stringRedisTemplate.opsForValue().set(key,value);
    }

    //向redis 存入一个字符串有过期时间
    public void  set(String key,String value,long expire){
        stringRedisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
    }
    //取出一个key
    public String get(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }

    //判断redis 的某个建是否存在 存在返回 true
    public boolean exist(String key){
        return stringRedisTemplate.hasKey(key);
    }

    //让某个key值 加1
    public void incr(String key){
        stringRedisTemplate.opsForValue().increment(key);
    }
    //删除某个键值对
    public void del(String key){
        stringRedisTemplate.delete(key);
    }

    //获取一个数据在ZSET 的排序值 这里要写Double 因为如果 没有该数据 会报错的
    //第一个是 健 第二个参数是成员
    public Double zscore(String key,String value){
        return stringRedisTemplate.opsForZSet().score(key,value);
    }


    //向ZSET中新增一个数据 score 属性表示收藏的数量

    public void  zadd(String key,String value,double score){
        stringRedisTemplate.opsForZSet().add(key,value,score);
    }
    //使ZSET中的某个数据的排序值自增
    public void zincrby(String key,String value,Double number){
        stringRedisTemplate.opsForZSet().incrementScore(key,value,number);
    }
    //删除某个 健 的 某个数据
    public void zrem(String key,String value){
        stringRedisTemplate.opsForZSet().remove(key,value);
    }

    //删除某个健 删除所有数据
    public void zrem(String key){
        stringRedisTemplate.opsForZSet().remove(key);
    }
    //做 我的收藏 排序 和分页
    public Set<String> zrevrange(String key,Integer start,Integer end){
        return stringRedisTemplate.opsForZSet().reverseRange(key,start,end);
    }
    //查询 我的收藏的数据 总条数
    public long zcard(String key){
        return stringRedisTemplate.opsForZSet().zCard(key);
    }
    //添加 多个 hest
    public void hmest(String key, Map<String,Object> map){
        stringRedisTemplate.opsForHash().putAll(key,map);
    }

    // hest 的值增加
    public void hincrby(String key,String hashKey,Integer number){
        stringRedisTemplate.opsForHash().increment(key,hashKey,number);
    }
    //查询 根据 key某个 hest 的健值对
    public Map<Object,Object> hgetall(String key){
        return stringRedisTemplate.opsForHash().entries(key);
    }




    //删除 某个hset
    public void delHest(String key){
        stringRedisTemplate.delete(key);
    }

    //查询zset 的所有value
    public Set<String> zrange(String key){
       return stringRedisTemplate.opsForZSet().range(key,0,-1);
    }
    //更新 某个hset 的值
    public void hset(String key,String hashKey,String hashValue){
        stringRedisTemplate.opsForHash().put(key,hashKey,hashValue);
    }
    //新增一个对象数据 并以字符串的形式保存到redis
    public  void setObject(String key ,Object value){
        redisObjectTemplate.opsForValue().set(key,value);
    }

    //新增一个对象数据 并以字符串的形式保存到redis 并设置过期时间
    public  void setObject(String key ,Object value,long minute){
        redisObjectTemplate.opsForValue().set(key,value,minute);
    }

    //获取一个对象数据
    public Object getObject(String key){
        return redisObjectTemplate.opsForValue().get(key);
    }
}
